<html>
    <head>
        <title>模块的各种使用模式</title>
    </head>
    <body>
        <script>
            /*
                        二、模块的各种使用模式

                                下图显示了分层良好的模块的包以及这些包之间的依赖关系：

                                    图可见与当前文件夹下 "模块项目依赖关系图.drawio"


                                最终目标是允许应用程序以灵活的方式使用该模块。示例应用程序：

                                    1、（A是一个客户端应用程序 web）单体应用程序使用模块：
                                    
                                                添加对Web 和 Application 层的引用。

                                                结果是：

                                                        应用程序可以显示模块的UI

                                                        它在同一进程中托管应用程序和领域层 （这就是为什么它需要引用数据库集成包）

                                                        此应用程序还为模块的HTTP API提供服务（因为它通过Web包包含HttpApi包）。


                                    2、（B可以是客户端应用程序 web、微服务）将模块作为独立的微服务使用：

                                                添加对HttpApi和Application包的引用。

                                                根据首选项添加对EF Core或MongoDB包之一的引用。

                                                结果是：

                                                    应用程序无法显示模块的UI，因为它没有对Web包的引用。

                                                    它在同一进程中托管应用程序和域层（这就是为什么它需要引用数据库集成包）。

                                                    此应用程序服务于模块的HTTP API（作为应用程序的主要目标）。


                                    3、（C可以是单体程序）只适用模块的UI，但是不托管应用程序的应用服务（只是将其用作由应用程序A或B托管的远程服务）

                                                    添加对Web和HttpApi. Client包的引用。

                                                    为HttpApi.Client包配置远程端点。

                                                    结果是：

                                                            应用程序可以显示模块的UI。

                                                            它不会在同一个进程中托管模块的应用程序层和域层。相反，将其用作远程服务。

                                                            此应用程序还为模块的HTTP API提供服务（因为它通过Web包包含HttpApi包）。


                                    4、(D是客户端应用程序)客户端应用程序(或微服务)，仅将模块用作远程服务 （由A、B 或 C 托管）

                                                    添加对HttpApi. Client包的引用。
                                                    
                                                    为HttpApi. Client包配置远程端点。


                                                    结果是：

                                                        应用程序可以将模块的所有功能用作远程客户端。

                                                        应用程序只是一个客户端，不能为模块的HTTP API提供服务。

                                                        应用程序只是一个客户端，不能显示模块的UI。

                                    5、（E相当于一个代理）托管模块的HTTP API但只将所有请求转发到另一个应用程序（由应用程序A、B或C托管）的代理应用程序：、

                                                    添加对HttpApi和HttpApi. Client包的引用。

                                                    为HttpApi. Client包配置远程端点。

                                                    结果是：

                                                        应用程序可以将模块的所有功能用作远程客户端。

                                                        此应用程序还为模块的HTTP API提供服务，但实际上通过将所有请求（针对模块）重定向到另一个远程服务器来像代理一样工作。

                    */

        </script>
    </body>
</html>